home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / PowerPlant / AGA Classes 1.2 / Utilities / LAGALittleArrows.cp < prev    next >
Text File  |  1996-06-30  |  7KB  |  269 lines

  1. // ===========================================================================
  2. //    LAGALittleArrows.cp
  3. // ===========================================================================
  4. //    “Apple Grayscale Appearance” compliant little-arrows control. Auto-repeats
  5. // if held down. Uses the same PPob as LStdCheckBox
  6. //
  7. // Copyright 1996 by Michael™ Hamel of ADInstruments NZ Ltd, mhamel@adi.co.nz
  8. //
  9. //    You may use this source code in any application (commercial, shareware, freeware,
  10. //    postcardware, etc), without acknowledgment, but may not remove this notice.
  11. //
  12. //    You may not sell this source code in any form. This source code may be placed on 
  13. //    publicly accessible archive sites and source code disks. It may not be placed on 
  14. //    for-profit archive sites and source code disks without the permission of the author.
  15. //
  16. //     This source code is distributed "as is", without any warranty. Use it at your own
  17. //  risk.
  18. //
  19. //        This class requires AGAColors.cp to be present in your project
  20. //
  21. //        Version : 1.2
  22. //
  23. //        Change History (most recent first, date in US form : mm/dd/yy):
  24. //
  25. //                        06/30/96    ca        Public release of version 1.2
  26. //                        06/27/96    ca        Changed checks for disabled state (check on triState_On instead of triState_Off)
  27. //                                                            in order that triState_Latent state is drawn as disabled
  28. //                        06/05/96    ca        Added RegisterClass method to ease registry
  29. //                                            Increased version to 1.2
  30. //                        05/21/96    M™H    Initial version set to 1.1 to be put with other AGA classes
  31. //
  32. //        To Do:
  33. //
  34.  
  35. #include "LAGALittleArrows.h"
  36. #include "AGAColors.h"
  37. #include <UTextTraits.h>
  38. #include <UDrawingState.h>
  39. #include <UDrawingUtils.h>
  40. #include <LStream.h>
  41.  
  42. //------------------------- LAGALittleArrows -------------------------------
  43.  
  44. enum {
  45.         kArrowWidth = 13,
  46.         kArrowHeight = 12,
  47.         kDownArrow = 2,
  48.         kUpArrow = 1,
  49.         kTextStart = 18
  50.       };
  51.  
  52. //    begin    <06/05/96    ca>
  53. void LAGALittleArrows::RegisterClass ()
  54.  
  55. {
  56.     URegistrar::RegisterClass(LAGALittleArrows::class_ID, (ClassCreatorFunc)LAGALittleArrows::CreateAGALittleArrowsStream);
  57. }
  58. //    end    <06/05/96    ca>
  59.  
  60. LAGALittleArrows*
  61. LAGALittleArrows::CreateAGALittleArrowsStream( LStream    *inStream)
  62. {
  63.     return (new LAGALittleArrows(inStream));
  64. }
  65.  
  66. LAGALittleArrows::LAGALittleArrows()
  67. :LControl()
  68. {
  69. }
  70.  
  71. LAGALittleArrows::LAGALittleArrows(const SPaneInfo &inPaneInfo,
  72.                                               MessageT inValueMessage,
  73.                                                ResIDT traitsID,
  74.                                                Str255 title)
  75. :LControl(inPaneInfo,inValueMessage,0,0,1)
  76. {
  77.     mTitle = title;
  78.     mTextTraitsID = traitsID;
  79. }
  80.  
  81. LAGALittleArrows::LAGALittleArrows( LStream    *inStream)
  82. : LControl(inStream)
  83. {
  84.     Int16        controlKind;
  85.     Int32        macRefCon;
  86.     
  87.     inStream->ReadData(&controlKind, sizeof(Int16));    // ignored
  88.     inStream->ReadData(&mTextTraitsID, sizeof(ResIDT));
  89.     inStream->ReadPString(mTitle);
  90.     inStream->ReadData(&macRefCon, sizeof(Int32));        // ignored
  91. }
  92.  
  93. LAGALittleArrows::~LAGALittleArrows()
  94. {
  95. }
  96.  
  97. void 
  98. LAGALittleArrows::DrawText ( )
  99. {
  100.     Rect        frame;
  101.     FontInfo    info;
  102.     short        space,
  103.                 alignment;
  104.     RGBColor textColor;
  105.     
  106.     if (CalcLocalFrameRect(frame)) {
  107.         frame.left += kTextStart;
  108.         alignment = UTextTraits::SetPortTextTraits(mTextTraitsID);
  109.               
  110.         // Get the font centered top/bottom
  111.         ::GetFontInfo(&info);
  112.         space = (frame.bottom - frame.top - (info.ascent + info.descent))/2;
  113.         frame.top += space;
  114.         frame.bottom -= space;
  115.         
  116.         if (mInColor) {
  117.             ::GetForeColor(&textColor);
  118.     
  119.             ApplyForeAndBackColors();
  120.             if (mEnabled == triState_On)                                                                                        //    <06/27/96    ca>
  121.                 ::RGBForeColor(&textColor);
  122.             else
  123.                 ::RGBForeColor(&gAGAColorArray[7]);
  124.         }
  125.         UTextDrawing::DrawWithJustification((Ptr)&mTitle[1], mTitle[0], frame, alignment);
  126.     }
  127. }
  128.  
  129. void
  130. LAGALittleArrows::DrawArrow(Boolean upArrow, Boolean pushed)
  131. {
  132.     PolyHandle aPoly;
  133.     Rect inSpace;
  134.     
  135.     CalcLocalFrameRect(inSpace);
  136.     inSpace.right = inSpace.left + kArrowWidth;
  137.     if (!upArrow) inSpace.top += kArrowHeight-1;
  138.     inSpace.bottom = inSpace.top + kArrowHeight;
  139.     
  140.     ::PenNormal();
  141.     if (mInColor) {
  142.         ApplyForeAndBackColors();
  143.         if (mEnabled != triState_On)                                                                                        //    <06/27/96    ca>
  144.             ::RGBForeColor(&gAGAColorArray[7]);
  145.     }
  146.     else if (mEnabled != triState_On)                                                                                    //    <06/27/96    ca>
  147.         ::PenPat(&qd.gray);
  148.             
  149.     ::FrameRect(&inSpace);
  150.     ::InsetRect(&inSpace,1,1);
  151.     
  152.     if (pushed) {
  153.         if (mInColor) ::RGBForeColor(&gAGAColorArray[8]);
  154.     }
  155.     else {
  156.         if (!mInColor) ::ForeColor(whiteColor);
  157.                      else ::RGBForeColor(&gAGAColorArray[2]);
  158.     }
  159.     ::PaintRect(&inSpace);
  160.     
  161.     if (mInColor) {
  162.         if (mEnabled != triState_On)                                                                                        //    <06/27/96    ca>
  163.             ::RGBForeColor(&gAGAColorArray[1]);
  164.         else if (pushed)
  165.             ::RGBForeColor(&gAGAColorArray[10]);
  166.         else
  167.             ForeColor(whiteColor);
  168.         ::MoveTo(inSpace.left,inSpace.bottom-2);
  169.         ::LineTo(inSpace.left,inSpace.top);
  170.         ::LineTo(inSpace.right-1,inSpace.top);
  171.         
  172.         if (pushed)
  173.             ::RGBForeColor(&gAGAColorArray[6]);
  174.         else
  175.             ::RGBForeColor(&gAGAColorArray[5]);
  176.         ::MoveTo(inSpace.right-1,inSpace.top+1);
  177.         ::LineTo(inSpace.right-1,inSpace.bottom-1);
  178.         ::LineTo(inSpace.left+1,inSpace.bottom-1);
  179.     }
  180.     
  181.     if (mEnabled != triState_On) {                                                                                    //    <06/27/96    ca>
  182.         if (mInColor) ::RGBForeColor(&gAGAColorArray[7]);
  183.                     else ::PenPat(&qd.gray);
  184.     }
  185.     else if (pushed)
  186.         ::ForeColor(whiteColor);
  187.     else
  188.         ::ForeColor(blackColor);
  189.     
  190.     if (upArrow) {
  191.         ::MoveTo(inSpace.left+2,inSpace.bottom-3);
  192.         aPoly = ::OpenPoly();
  193.         ::Line(7,0);
  194.         ::Line(-4,-4);
  195.         ::Line(-3,3);
  196.     }
  197.     else {
  198.         ::MoveTo(inSpace.left+2,inSpace.top+3);
  199.         aPoly = ::OpenPoly();
  200.         ::Line(7,0);
  201.         ::Line(-4,4);
  202.         ::Line(-4,-4);
  203.     }
  204.     ::ClosePoly();
  205.     ::PaintPoly(aPoly);
  206.     ::KillPoly(aPoly);
  207.     
  208. }
  209.  
  210. void
  211. LAGALittleArrows::DrawSelf()
  212. {
  213.     StColorPenState  savedState;    
  214.     
  215.     savedState.Normalize();
  216.     mInColor = ::PaneInColor(this);
  217.     DrawText();
  218.     DrawArrow(TRUE,FALSE);
  219.     DrawArrow(FALSE,FALSE);
  220. }
  221.  
  222. Int16
  223. LAGALittleArrows::FindHotSpot( Point    localPt )
  224. // Control has an up-arrow (1) and a down-arrow (2)
  225. {
  226.     Rect aRect;
  227.     CalcLocalFrameRect(aRect);
  228.     if (localPt.v > aRect.top + kArrowHeight) return kDownArrow;
  229.                                                      else return kUpArrow;
  230. }
  231.  
  232. void
  233. LAGALittleArrows::HotSpotAction(short    inHotSpot, Boolean    inCurrInside, Boolean    inPrevInside)
  234. {
  235.     SysPPtr sysP;
  236.     Int32 value;
  237.                     
  238.     if (inCurrInside != inPrevInside) {
  239.         StColorPenState  savedState;        
  240.         FocusDraw();
  241.         DrawArrow(inHotSpot==kUpArrow, inCurrInside);
  242.         if (inCurrInside) {
  243.             sysP = ::GetSysPPtr();  // Get repeat delay from PRAM
  244.             mNextBroadcast = ::TickCount() + 4*((sysP->kbdPrint>>12) & 0xF);
  245.             mDoneOne = FALSE;
  246.         }
  247.     }
  248.     if (inCurrInside) {
  249.         if (::TickCount() >= mNextBroadcast) {
  250.             value = inHotSpot;
  251.             BroadcastMessage(mValueMessage,(void*) &value);
  252.             sysP = ::GetSysPPtr();  // Get repeat rate from PRAM
  253.             mNextBroadcast = mNextBroadcast + 2*((sysP->kbdPrint>>8) & 0xF);
  254.             mDoneOne = true;
  255.         }
  256.     }
  257. }
  258.  
  259. void
  260. LAGALittleArrows::HotSpotResult(short inHotSpot)
  261. {
  262.     HotSpotAction(inHotSpot, false, true);
  263.     if (!mDoneOne) {
  264.         Int32 value = inHotSpot;
  265.         BroadcastMessage(mValueMessage,(void*) &value);
  266.     }
  267. }
  268.  
  269.